home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 April / EnigmA AMIGA RUN 06 (1996)(G.R. Edizioni)(IT)[!][issue 1996-04][Skylink CD V].iso / progs / editor / write-ed / rexx / pgp.wrx < prev    next >
Text File  |  1995-04-17  |  16KB  |  585 lines

  1. /*
  2.  * REXX-Skript für WRITE 3.1776 © 1989 - 1995 by Tim Teulings
  3.  *
  4.  * $VER: PGP.wrx 1.3 (05-Apr-95) © Tim Teulings
  5.  *
  6.  * History:
  7.  *
  8.  * 1.3  removed aother problem with the searchpath, shoud
  9.  *      work in all cases now                               [TT]
  10.  * 1.2  removed some bugs and added one requester           [tom]
  11.  * 1.1. addapted to new &rexxvar-feature and fixed some bug
  12.  *      using files containing spaces (Ram Disk:)           [TT]
  13.  * 1.0  initial WRITE version                               [TT]
  14.  *
  15.  * Sorry, but it was impossible for me to contact the author...
  16.  *
  17.  *
  18.  *  original GoldEd-Skript by
  19.  *
  20.  *  Autor: Lunz O. Wolfgang (Luwo)
  21.  *         <W.LUNZ@link-ba.cl.sub.de>
  22.  *
  23.  *    VER: PGP-GoldEd-Script V0.91  ©Luwo (29.04.1994)
  24.  *
  25.  *
  26.  */
  27.  
  28.  
  29. ADDRESS COMMAND  'STACK 12000'        /* PGP ist ziemlich hungrig :) */
  30.  
  31. lib = 'rexxreqtools.library'
  32. if ~show('l',lib) then call addlib(lib,0,-30,0)
  33.  
  34.  
  35. OPTIONS RESULTS                            /* enable return codes    */
  36.  
  37.  
  38. OPTIONS FAILAT 6                           /* ignore warnings        */
  39. SIGNAL ON SYNTAX                           /* ensure clean exit      */
  40. SIGNAL ON ERROR                            /* trap errors            */
  41.  
  42.  
  43. /* INITIALISIERUNG VON WRITE */
  44.  
  45. 'GETVAR "_CurrentID"'
  46. ID = RESULT           /* GETVAR gibt den ID des aktuellen Fenster zurück,  */
  47.                       /* der von den weiteren Befehlen benötigt wird.      */
  48.  
  49. IF ID=0 THEN DO
  50.   MESSAGEOK (Kein Fenster aktiviert !)
  51.   EXIT
  52. END
  53.  
  54. OPENPORT ID           /* PrivatePort des aktuellen Fensters öffnen        */
  55. Port = RESULT
  56.  
  57. IF Port="" THEN DO    /* 'OPENPORT' gibt "" zurück, wenn Port nicht       */
  58.                       /* geöffnet werden konnte                           */
  59.  
  60.   LOCKWINDOW ID       /* Fenster locken                                   */
  61. END
  62. ELSE DO
  63.   INTERPRET ADDRESS Port  /* PrivatePort addressieren.Alle Komandos beziehen */
  64.                           /* sich nun auf das Fenster mit diesem Port        */
  65. END
  66.  
  67. IF Port="" THEN
  68.   WRITEPORT="WRITE"
  69. ELSE
  70.   WRITEPORT=Port
  71.  
  72. /* ENDE DER INITIALISIERUNG VON WRITE */
  73.  
  74. /*********************************************************/
  75. /* Userconfigurierbare Variablen                         */
  76. /*********************************************************/
  77.  
  78. USERFILE = 'T:PGP_userIDs.tmp'           /* einige Standard-Variablen */
  79. UserPath = 'T:Users'
  80.  
  81. /*********************************************************/
  82.  
  83. IDstring = '0x'
  84. NL       = '0a'x
  85. CLRSCR   = '0c'x
  86. PGP      = SEARCHPATH()   /* den Pfad aus der PGPPATH-Variablen lesen */
  87.  
  88. 'GETVAR "_FileName"'
  89. DEFAULTFILENAME = RESULT
  90.  
  91. 'GETVAR "_marked"'
  92. IF RESULT=2 THEN
  93.   BLOCKMARKIERUNG = "TRUE"
  94. ELSE
  95.   BLOCKMARKIERUNG="FALSE"
  96.  
  97. ORGFILENAME=DEFAULTFILENAME
  98.  
  99. IF BLOCKMARKIERUNG="TRUE" then
  100.   ORGFILENAME=DEFAULTFILENAME'.block'
  101.  
  102.  
  103.  
  104. /* --------- Begin der Verzweigungsroutine ------------------------- */
  105.  
  106.  
  107.  
  108. IF ARG(1)="READ_PGP" then READ_PGP()               /* Läuft */
  109. IF ARG(1)="WRITE_PGP" then WRITE_PGP()
  110. IF ARG(1)="ENCODE_normal" then ENCODE_normal()
  111. IF ARG(1)="DECODE_normal" then DECODE_normal()
  112. IF ARG(1)="UNTERSCHREIBEN" then UNTERSCHREIBEN()   /* Läuft */
  113. IF ARG(1)="KEY_aufnehmen" then KEY_aufnehmen()
  114. IF ARG(1)="KEY_ansehen" then KEY_ansehen()
  115. IF ARG(1)="KEY_editieren" then KEY_editieren()
  116. IF ARG(1)="KEY_entfernen" then KEY_entfernen()
  117. IF ARG(1)="KEY_beglaubigen" then KEY_beglaubigen()
  118. IF ARG(1)="KEY_anhaengen" then KEY_anhaengen()
  119. IF ARG(1)="KEY_generieren" then KEY_generieren()
  120.  
  121.  
  122. /* Kein verfügbarer Parameter ! */
  123.  
  124.  
  125. ADDRESS "WRITE"
  126. 'MESSAGEOK "PGP-Script-Fehler!\n\nKein Aktion angegeben!"'
  127.  REALLYQUIT()
  128.  
  129. /*----------- Ende der Verzweigungsroutine --------------------------*/
  130.  
  131. /*-------------------------------------------------------------------*/
  132. READ_PGP:                     /* PGP analysiert den Text selbständig */
  133.  
  134.      CALL SAVER()
  135.      ADDRESS COMMAND PGP || ' +FORCE "' || ORGFILENAME || '" "-o' || ORGFILENAME || '"'
  136.      CALL LOADER()
  137. REALLYQUIT('k')
  138. end
  139. /*-------------------------------------------------------------------*/
  140.  
  141.  
  142.  
  143. /*-------------------------------------------------------------------*/
  144. WRITE_PGP:                   /* Der Text wird für die entsprechenden */
  145.                              /* Empfänger codiert...                 */
  146.       CALL SAVER()
  147.  
  148.       TITXT = 'Text verschlüsseln...'
  149.       BTTXT = '_Ja|_Nein'
  150.       BDTXT = 'Wollen sie den Text\nauch unterschreiben?'
  151.       call ABFRAGE()
  152.       if ergebnis=1 then
  153.            signcmd=' -tea '
  154.         else
  155.            signcmd=' -teas  '
  156.  
  157.       REQTITEL="Wählen sie die Empfänger.."
  158.       empfaengerliste = GETEMPFAENGER()
  159.         if empfaengerliste ~= '' then
  160.             do
  161.              ADDRESS COMMAND
  162.              PGP SIGNCMD '+FORCE "' || ORGFILENAME || '"' EMPFAENGERLISTE
  163.              'c:copy >nil: "' || ORGFILENAME'.asc" "' || ORGFILENAME || '"'
  164.              'c:delete >nil: "'ORGFILENAME'.asc"'
  165.             end
  166.       CALL LOADER()
  167. REALLYQUIT()
  168. end
  169. /*-------------------------------------------------------------------*/
  170.  
  171.  
  172. /*-------------------------------------------------------------------*/
  173. ENCODE_normal:       /* Der Text wird mit einem Mantra verschlüsselt */
  174.  
  175.        CALL SAVER()
  176.        ADDRESS COMMAND
  177.        PGP '-cta "' || ORGFILENAME || '"'
  178.        'c:copy >nil: "' || ORGFILENAME'.asc" "' || ORGFILENAME || '"'
  179.        'c:delete >nil: || "'ORGFILENAME'.asc"'
  180.        CALL LOADER()   /* 'OPEN AGAIN' */
  181. REALLYQUIT()
  182. end
  183. /*-------------------------------------------------------------------*/
  184.  
  185.  
  186. /*-------------------------------------------------------------------*/
  187. DECODE_normal:       /* Der Text wird mit einem Mantra entschlüsselt */
  188.  
  189.        CALL SAVER()
  190.         ADDRESS COMMAND
  191.        PGP '-d +FORCE "' || ORGFILENAME || '" "-o' ORGFILENAME || '"'
  192.        CALL LOADER()
  193. REALLYQUIT()
  194. end
  195. /*-------------------------------------------------------------------*/
  196.  
  197. /*-------------------------------------------------------------------*/
  198. UNTERSCHREIBEN:       /* Der Text wird mit der persönlichen Signatur */
  199.                       /* unterschrieben, und ggfs. komprimiert       */
  200.  
  201.           TITXT = 'Text unterschreiben...'
  202.           BTTXT = '_Ja|_Nein'
  203.           BDTXT = 'Wollen sie den Text\nauch komprimieren?'
  204.           call ABFRAGE()
  205.           if ergebnis=1 then
  206.                signcmd=' -sat +clearsig=on '
  207.             else
  208.                signcmd=' -sat +clearsig=off '
  209.  
  210.        CALL SAVER()
  211.            ADDRESS COMMAND
  212.            PGP SIGNCMD || '"' || ORGFILENAME || '"'
  213.           'C:copy >nil: "' || ORGFILENAME'.asc" "' || ORGFILENAME || '"'
  214.           'c:delete >nil: "' || ORGFILENAME|| '.asc"'
  215.        CALL LOADER()
  216. REALLYQUIT()
  217. end
  218. /*--------------------------------------------------------------------*/
  219.  
  220. /*--------------------------------------------------------------------*/
  221. KEY_aufnehmen:
  222.      CALL SAVER()
  223.      ADDRESS COMMAND
  224.      PGP '-ka "' || ORGFILENAME || '"'
  225.      if exists(USERFILE) then
  226.        'c:delete >nil: "'USERFILE || '"'
  227.      CALL LOADER()
  228. REALLYQUIT('key')
  229. end
  230. /*--------------------------------------------------------------------*/
  231.  
  232. /*--------------------------------------------------------------------*/
  233. KEY_ansehen:
  234.      REQTITEL="Welchen Key ansehen?..."
  235.      empfaengerliste = GETEMPFAENGER()
  236.      if empfaengerliste ~= '' then
  237.         do
  238.           ADDRESS COMMAND
  239.           PGP '-kvvc '|| empfaengerliste
  240.           REALLYQUIT('key')
  241.         end
  242. REALLYQUIT()
  243. end
  244. /*--------------------------------------------------------------------*/
  245.  
  246.  
  247. /*--------------------------------------------------------------------*/
  248. KEY_editieren:
  249.      REQTITEL="Welchen Key editieren?..."
  250.      empfaengerliste = GETEMPFAENGER()
  251.      if empfaengerliste ~= '' then
  252.         do
  253.           ADDRESS COMMAND
  254.           PGP '-ke '|| empfaengerliste
  255.           REALLYQUIT('key')
  256.         end
  257. REALLYQUIT()
  258. end
  259. /*--------------------------------------------------------------------*/
  260.  
  261.  
  262. /*--------------------------------------------------------------------*/
  263. KEY_entfernen:
  264.      REQTITEL="Welchen Key entfernen?..."
  265.      empfaengerliste = GETEMPFAENGER()
  266.      if empfaengerliste ~= '' then
  267.         do
  268.           INTERPRET ADDRESS WRITEPORT
  269.           TITXT = 'Public-keys entfernen?'
  270.           BTTXT = '_Nein|_Ja'
  271.           BDTXT = Namensliste
  272.           call ABFRAGE()
  273.           if ergebnis =0 then
  274.             do
  275.                ADDRESS COMMAND
  276.                PGP '-kr ' empfaengerliste
  277.                'c:delete >nil: 'USERFILE' T:users ALL'
  278.                REALLYQUIT('key')
  279.             end
  280.         end
  281. REALLYQUIT()
  282. end
  283. /*--------------------------------------------------------------------*/
  284.  
  285.  
  286. /*--------------------------------------------------------------------*/
  287. KEY_beglaubigen:
  288.    REQTITEL="Welchen Key beglaubigen?..."
  289.    empfaengerliste = GETEMPFAENGER()
  290.      if empfaengerliste ~= '' then
  291.         do
  292.           ADDRESS COMMAND
  293.           PGP '-ks '|| empfaengerliste
  294.           REALLYQUIT('key')
  295.         end
  296. REALLYQUIT()
  297. end
  298. /*--------------------------------------------------------------------*/
  299.  
  300.  
  301. /*--------------------------------------------------------------------*/
  302. KEY_anhaengen:
  303.  
  304.    REQTITEL="RADIX-64-Key einfügen..."
  305.  
  306.      empfaengerliste = GETEMPFAENGER()
  307.      if empfaengerliste ~= '' then
  308.        do
  309.             do i = 1 to words(empfaengerliste)
  310.              ADDRESS COMMAND
  311.              PGP '-fkxa 'word(empfaengerliste,i) ' >t:PGPextract.tmp'i
  312.             end
  313.  
  314.              INTERPRET ADDRESS WRITEPORT
  315.              'GETVAR "_yPos"'
  316.              LIN = RESULT
  317.              'GETVAR "_xPos"'
  318.              COL = RESULT
  319.              BDTXT="Wo wollen Sie den(die)\nRADIX-64 (ASCII)\nPublicKey(s) einfügen?"
  320.              TITXT="Radix-64 Public-Key insert:"
  321.              BTTXT="_Cursor|Text_ende|_Vergiß es!"
  322.  
  323.              CALL ABFRAGE()
  324.  
  325.             if ERGEBNIS ~= 2 then
  326.                do i = 1 to words(empfaengerliste)
  327.  
  328.                  'LOADBUFFER "t:PGPextract.tmp&i&" "0"'
  329.  
  330.                  if ERGEBNIS=0 THEN
  331.                    'GOTO 1 @CURSOR INSERTBLOCK "0"'
  332.                  if ERGEBNIS=1 THEN
  333.                    'GOTO 1 @EOT INSERTBLOCK "0"'
  334.  
  335.                end
  336.  
  337.             GOTO LIN COL
  338.             address command 'c:delete >nil: t:PGPextract.tmp#?'
  339.  
  340.        end
  341.  
  342. REALLYQUIT()
  343. end
  344. /*--------------------------------------------------------------------*/
  345.  
  346.  
  347. /*--------------------------------------------------------------------*/
  348. KEY_generieren:
  349.           TITXT = 'Secret-key generieren?'
  350.           BTTXT = '_Nein|_Ja'
  351.           BDTXT = 'Wollen Sie tatsächlich\neinen geheimen Schlüssel\ngenerieren?'
  352.           call ABFRAGE()
  353.           if ergebnis =0 then
  354.            do
  355.              ADDRESS COMMAND
  356.               PGP '-kg '
  357.               'c:delete >nil: 'USERFILE
  358.              REALLYQUIT('key')
  359.            end
  360. REALLYQUIT()
  361. end
  362. /*--------------------------------------------------------------------*/
  363.  
  364.  
  365.  
  366. /* ---------------- Auswahl der Empfaenger--------------------------- */
  367. GETEMPFAENGER:
  368.  
  369. ADDRESS COMMAND
  370. drop empfaengerliste
  371. PGPcmd   = ''
  372. namensliste= ''
  373.  
  374. /* ist der T:user-Path schon da? */
  375.  if ~EXISTS(UserPath) then 'C:makedir ' USERPATH
  376.  
  377. /* sind die UserIds schon extrahiert? */
  378.  if ~EXISTS(USERFILE) then  call MAKEUSERLISTE()
  379.  
  380. call rtfilerequest("T:Users/", , REQTITEL, ,"rtfi_flags=freqf_multiselect rt_pubscrname=WORKBENCH",empfaenger)
  381.  
  382. if empfaenger == 1 then
  383.   do
  384.     do i=1 to empfaenger.count
  385.       call Open('USID',empfaenger.i,"R")
  386.       dummy = readch('USID',8)
  387.       call Close('USID')
  388.  
  389.       if left(dummy,2)="0x" then
  390.         do
  391.           PGPcmd=PGPcmd dummy
  392.           namensliste =namensliste right(empfaenger.i,length(empfaenger.i)-8) '|'
  393.         end
  394.     end
  395.   end
  396.  
  397.   call rtfreefilebuffer()
  398. return PGPcmd
  399. /*--------------------------------------------------------------------*/
  400.  
  401.  
  402. /* Erstellen der aus der pubring.key-datei extrahierten User Ids */
  403. MAKEUSERLISTE:
  404.     ADDRESS COMMAND PGP ' -kv >'USERFILE
  405.        call Open('UFID',USERFILE,'R')
  406.            do until EOF('UFID')=1
  407.               dummy = READLN('UFID')
  408.  
  409.                 if (UPPER(LEFT(dummy,3))="PUB")&(word(dummy,4)~='***') then
  410.  
  411.                   do
  412.                     keyid = right(word(dummy,2),6)
  413.                     namestart= wordindex(dummy,4)
  414.                     nameend= pos('<',dummy)
  415.                      if nameend=0 then nameend=LENGTH(dummy)+2
  416.                     namelength=nameend-namestart-1
  417.                     name=substr(dummy,namestart,namelength)
  418.                     name=compress(name,':;/><')
  419.  
  420.                     call Open('currentUser',UserPath'/'name,'W')
  421.                     call Writech('currentUser',IDSTRING||KEYID)
  422.                     call Close('currentUser')
  423.  
  424.                   end
  425.  
  426.            end
  427.        call Close('UFID')
  428. say Clrscr
  429. return
  430. /*--------------------------------------------------------------------*/
  431.  
  432.  
  433. /* ------------------- diverse Unterprogramme ----------------------- */
  434.  
  435. SAVER:               /* Speichert, je nachdem, ob die Blockmarkierung */
  436.                      /* aktiviert wurde oder nicht, den ganzen Text,  */
  437.                      /* oder nur einen Ausschnitt daraus ab...        */
  438. INTERPRET ADDRESS WRITEPORT
  439. if BLOCKMARKIERUNG="FALSE" then
  440.     do
  441.       'SAVE _FileName'
  442.     return 0
  443.     end
  444.  
  445. if BLOCKMARKIERUNG="TRUE" then
  446.     do
  447.       'COPYBLOCK "0"'
  448.       'SAVEBUFFER &ORGFILENAME "0"'
  449.       CLEARBUFFER
  450.     return 0
  451.     end
  452. end
  453.  
  454. /*--------------------------------------------------------------------*/
  455. LOADER:         /* Lädt, je nachdem, ob die Blockmarkierung aktiviert */
  456.                 /* wurde oder nicht, den ganzen Text, oder auch nur   */
  457.                 /* einen Block wieder ein...                          */
  458.  
  459. INTERPRET ADDRESS WRITEPORT
  460. if BLOCKMARKIERUNG="FALSE" then
  461.     do
  462.       'OPEN _FileName'
  463.     return 0
  464.     end
  465.  
  466. if BLOCKMARKIERUNG="TRUE" then
  467.     do
  468.       'DELETEBLOCK'
  469.       'LOADBUFFER &ORGFILENAME "0"'
  470.       'INSERTBLOCK "0"'
  471.       ADDRESS COMMAND 'c:delete >nil: 'ORGFILENAME
  472.     return 0
  473.     end
  474. end
  475.  
  476.  
  477. /*--------------------------------------------------------------------*/
  478. SEARCHPATH:
  479.  
  480. ADDRESS COMMAND
  481. if exists('env:PGPPATH') then
  482.     do
  483.      call Open('binpath','ENV:PGPPATH','R')
  484.      pgp=readln('binpath')
  485.      call Close('binpath')
  486.      IF right(pgp,1)~=':' THEN
  487.        pgp=pgp || '/'
  488.      pgp=pgp || "PGP"
  489.  
  490.      if ~exists(pgp) then
  491.        pgp="PGP"
  492.     end
  493.  
  494. else
  495.     do
  496.      INTERPRET ADDRESS WRITEPORT
  497.      TITXT = 'PGP-AREXX-INTERNAL-ERROR'
  498.      BTTXT = '_OKIDOKI'
  499.      BDTXT = "Die PGPPATH-Variable ist nicht gesetzt!\nBitte deklarieren sie diese!|\nVorläufig wird 'C:PGP' verwendet"
  500.      call ABFRAGE()
  501.      return 'c:pgp'
  502.     end
  503.  
  504. ADDRESS COMMAND
  505. return PGP
  506. end
  507.  
  508.  
  509. /*--------------------------------------------------------------------*/
  510. ABFRAGE:                              /* Erstellt einen Requester...  */
  511.  
  512. INTERPRET ADDRESS WRITEPORT
  513. 'ASK "&TITXT&\n\n&BDTXT&" &BTTXT'
  514. ERGEBNIS = RESULT
  515. return 0
  516. end
  517.  
  518.  
  519. /*--------------------------------------------------------------------*/
  520. REALLYQUIT:
  521. INTERPRET ADDRESS WRITEPORT
  522. arg QUITTER
  523.  
  524. if QUITTER~=''then
  525.     do
  526.       say NL 'Bitte "Return" um weiterzumachen'
  527.       pull QUITTER
  528.     end
  529.  
  530. 'SETVAR "_FileName" &DEFAULTFILENAME'
  531.  
  532.  
  533. /* Schließen des Ports/Unlocken des Fensters */
  534.  
  535. IF Port="" THEN DO
  536.   LOCKWINDOW 0
  537. END
  538. ELSE DO
  539.   CLOSEPORT ID
  540. END
  541.  
  542. EXIT
  543.  
  544. /*--------------------------------------------------------------------*/
  545. ERROR:
  546.       say NL 'Ein Fehler ('RC') ist in Zeile:'SIGL' aufgetreten :~('
  547.       say    '-=> [Press return]'
  548.       pull QUITTER
  549.  
  550. INTERPRET ADDRESS WRITEPORT
  551. 'SETVAR "_FileName" &DEFAULTFILENAME'
  552.  
  553. /* Schließen des Ports/Unlocken des Fensters */
  554.  
  555. IF Port="" THEN DO
  556.   LOCKWINDOW 0
  557. END
  558. ELSE DO
  559.   CLOSEPORT ID
  560. END
  561.  
  562. EXIT
  563.  
  564.  
  565.  
  566. /*--------------------------------------------------------------------*/
  567. SYNTAX:
  568.  INTERPRET ADDRESS WRITEPORT
  569. SAY "Sorry, Syntax-error line" SIGL ":" ERRORTEXT(RC) ":-("
  570.  
  571. /* Schließen des Ports/Unlocken des Fensters */
  572.  
  573. IF Port="" THEN DO
  574.   LOCKWINDOW 0
  575. END
  576. ELSE DO
  577.   CLOSEPORT ID
  578. END
  579.  
  580. EXIT
  581.  
  582.  
  583. /*--------------------------------------------------------------------*/
  584.  
  585.